
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author igor_ufrn
 */
public class FuncionarioDao {

    public Collection<Funcionario> findAll() {

        try {

        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();

        Collection<Funcionario> funcionarios = (Collection<Funcionario>) session.createQuery("FROM Funcionario").list();

        transaction.commit();
        session.close();

        return funcionarios;

        }
        catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public Funcionario findUsuario(String login, String senha) {
        try {

        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();

        Query q = session.createQuery(" FROM Funcionario f " +
                                                        " WHERE f.login like :login " +
                                                        "       and f.senha like :senha ");

        q.setString("login", login);
        q.setString("senha", senha);
        Funcionario funcionario = (Funcionario) q.uniqueResult();

        transaction.commit();
        session.close();

        return funcionario;

        }
        catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public Collection<Funcionario> findFuncionarios(Integer id, String nome, String identidade, String cpf, Date dataNascimento) {

        try {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction secondTransaction = session.beginTransaction();

        StringBuilder hqlConsulta = new StringBuilder();
        StringBuilder hqlFiltros = new StringBuilder();

        hqlConsulta.append(" FROM Funcionario f " +
                           " WHERE f.tipoPessoa = :Funcionario ");
        if( id != null ) {
            hqlFiltros.append(" and  f.id = :id");
        }

        if( nome != null && !nome.equals("") ) {
            hqlFiltros.append(" and  f.nome like :nome ");
        }

        if( identidade != null && !identidade.equals("") ) {
            hqlFiltros.append(" and  f.identidade like :identidade ");
        }

        if( cpf != null && !cpf.equals("") ) {
            hqlFiltros.append(" and f.cpf like :cpf ");
        }       

        if( dataNascimento != null ) {
            hqlFiltros.append(" and f.dataNascimento = :dataNascimento ");
        }

        hqlConsulta.append(hqlFiltros);
        Query q = session.createQuery(hqlConsulta.toString());

        q.setInteger("Funcionario", Pessoa.FUNCIONARIO);

        if(id != null) {
            q.setInteger("id", id);
        }

        if( nome != null && !nome.equals("") ) {
            q.setString("nome", "%"+nome+"%");
        }

        if( identidade != null && !identidade.equals("") ) {
            q.setString("identidade", identidade);
        }

        if( cpf != null && !cpf.equals("") ) {
            q.setString("cpf", cpf);
        }        

        if( dataNascimento != null ) {            
            q.setDate("dataNascimento", dataNascimento);
        }

        List<Object> objetos = q.list();
        Collection<Funcionario> funcionarios = new ArrayList<Funcionario>();

        for(Object obj : objetos) {
            funcionarios.add((Funcionario)obj);
        }

        secondTransaction.commit();
        session.close();

        return funcionarios;

        }
        catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }


}
